// 对 url 和 <a> 做缓存，避免某些浏览器或 webview 报错。
let url: string | null = null;
let a: HTMLAnchorElement | null = null;

/**
 * 下载文件
 * @param url         url
 * @param filename    文件名，会覆盖file中的
 */
export function downloadUrl(url: string, filename?: string): void {
  // 生成 a标签
  if (a) {
    document.body.removeChild(a);
  }
  a = document.createElement('a');
  a.href = url;
  document.body.appendChild(a);

  a.download = filename ?? '';

  // 下载
  a.click();
}

/**
 * 下载内存文件
 * @param data        data
 * @param filename    文件名，会覆盖file中的
 */
export function downloadFile(data: File, filename?: string);
export function downloadFile(data: Blob, filename: string);
export function downloadFile(data: Blob, filename?: string): void {
  let blob: Blob;

  if (data instanceof File) {
    blob = data;
    filename = filename ?? data.name;
  } else {
    blob = new Blob([data], { type: 'application/vnd.ms-excel;' });
    filename = filename ?? '';
  }

  // 生成 object url
  if (url) {
    URL.revokeObjectURL(url);
  }
  url = URL.createObjectURL(blob);

  downloadUrl(url, filename);
}

/**
 * 下载媒体文件
 * @param fileId      文件id
 * @param filename    文件名，会覆盖file中的
 */
export function downloadMedia(fileId: string): void {
  const url = `/api/media/api/v1/media/download/${fileId}`;

  downloadUrl(url);
}
